﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Domain;
using Interfaces;
using System.Runtime.Serialization;
using CyclicReferences.Public;

namespace Server.Test
{
    /// <summary>
    /// Summary description for EmployeeTest
    /// </summary>
    [TestClass]
    public class EmployeeTest
    {
        #region setup
        public EmployeeTest()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion 
        #endregion

        [TestMethod]
        public void testCanInsertNewEmployee()
        {
            IEmployeeService svc = new EmployeeService();

            Mort dev = new Mort { EF = true, Firstname = "Ruurd", Language = "C#", Lastname = "Boeke", WCF = false, WF = true, WPF = true };

            Assert.IsTrue(dev.PersonID == 0);

            Person saved = svc.SavePerson(dev);

            Assert.IsTrue(saved.PersonID > 0);
        }

        [TestMethod]
        public void testCanUpdateEmployee()
        {
            IEmployeeService svc = new EmployeeService();

            Mort dev = new Mort { EF = true, Firstname = "Ruurd", Language = "C#", Lastname = "Boeke", WCF = false, WF = true, WPF = true };
            svc.SavePerson(dev);

            // we need to serialize, deserialize to fake going to the client
            DataContractSerializer s = new DataContractSerializer(dev.GetType(), null, int.MaxValue, false, false, new SubstituteDomainDataContractSurrogate());
            string msg = s.GetWellFormedToContract(dev);
            s = new DataContractSerializer(dev.GetType(), null, int.MaxValue, false, false, new SubstituteDomainDataContractSurrogate());
            dev = (Mort) s.UnwrapFromString(msg);
            

            dev.Firstname = "Changed";
            dev.WCF = true;

            dev = (Mort) svc.SavePerson(dev);

            Assert.IsTrue(dev.WCF);
            Assert.IsTrue(dev.Firstname == "Changed");
            
        }

        [TestMethod]
        public void testWillReturnListOfEmployeesOnLastname()
        {
            IEmployeeService svc = new EmployeeService();

            // first insert one
            Mort dev = new Mort { EF = true, Firstname = "Ruurd", Language = "C#", Lastname = "Boeke", WCF = false, WF = true, WPF = true };
            svc.SavePerson(dev);

            List<Employee> employees = svc.GetEmployees("Boe");

            Assert.IsTrue(employees.Count > 0);
        }

        [TestMethod]
        public void testWillReturnNullForUnknownEmployeeOnID()
        {
            IEmployeeService svc = new EmployeeService();

            Employee e = svc.GetEmployee(-1);

            Assert.IsNull(e);
        }

        [TestMethod]
        public void testWillReturnEmployeeForValidID()
        {
            IEmployeeService svc = new EmployeeService();

            Mort dev = new Mort { EF = true, Firstname = "Ruurd", Language = "C#", Lastname = "Boeke", WCF = false, WF = true, WPF = true };
            svc.SavePerson(dev);

            Employee e = svc.GetEmployee(dev.PersonID);

            Assert.IsNotNull(e);
        }



    }
}
